#pragma once
#include <stdlib.h>

typedef struct d_link_node_s{
    void *ptr;
    struct d_link_node_s *prev,*next;
}d_link_node_t;

d_link_node_t *d_link_node_create(void *ptr);

void d_link_node_destory(d_link_node_t *node);

void d_link_node_splice_self(d_link_node_t *node);

void d_link_node_move_front_of(d_link_node_t *target,d_link_node_t *node);

typedef struct d_list_s{
    d_link_node_t *dummy_head,*dummy_tail;
}d_list_t;

d_list_t *d_list_create();

void d_list_destory(d_list_t *d_list);

void d_list_push_back(d_list_t *d_list,d_link_node_t *node);

typedef struct cqueue_s{
    d_list_t **d_list_arr;
    size_t front;
    size_t size;
}cqueue_t;

cqueue_t *cqueue_create(size_t size);

void cqueue_destory(cqueue_t *cqueue);

void cqueue_step_next(cqueue_t *cqueue);

d_list_t *cqueue_front(cqueue_t *cqueue);

void cqueue_move_to_rear(cqueue_t *cqueue,d_link_node_t *node);

void cqueue_move_to_front(cqueue_t *cqueue,d_link_node_t *node);

